package com.dews.common.utils.excel;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * 通用读取数据处理的Excel类
 *
 * @author qingfeng
 * @version 1.0.0
 * @date 2024/12/30
 */
public class CommonListener<T> extends AnalysisEventListener<T> {

    private List<T> list;
    private Supplier<Boolean> supplier;

    /**
     * 批量处理的大小
     */
    private Integer batchSize;

    /**
     * 传统只为了获取数据，不关心数据处理
     *
     * @param list
     */
    public CommonListener(ArrayList<T> list) {
        this.list = list;
    }

    /**
     * 需要进行分批数据处理，无参有返回值的场景
     *
     * @param list
     * @param supplier
     */
    public CommonListener(List<T> list,
                          Integer batchSize,
                          Supplier<Boolean> supplier) {
        this.list = list;
        this.batchSize = batchSize;
        this.supplier = supplier;
    }

    /**
     * 一行一行读取Excel内容，从第二行读取，第一行是表头不读取
     *
     * @param data
     * @param analysisContext
     */
    @Override
    public void invoke(T data, AnalysisContext analysisContext) {
        list.add(data);
        if (ObjectUtil.isNotNull(batchSize) && list.size() >= batchSize) {
            // 需要对数据进行分批处理
            Boolean resultCode = supplier.get();
            if (resultCode) {
                // 说明成功
                // 处理完清空list
                list.clear();
            } else {
                // 终止
                throw new RuntimeException("数据处理失败");
            }

        }
    }


    /**
     * 读取Excel结束后调用
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (ObjectUtil.isNotNull(batchSize) && list.size() >= 0) {
            // 需要对数据进行分批处理
            Boolean resultCode = supplier.get();
            if (resultCode) {
                // 说明成功
                // 处理完清空list
                list.clear();
            } else {
                // 终止
                throw new RuntimeException("数据处理失败");
            }
        }
    }

}
